#include "../inc/gui.h"

// 获取 LVGL 对象指针
lv_obj_t* UI_Object::get_lv_obj_t()
{
    return this_object;  // 返回当前 UI 元素的 LVGL 对象指针
}

// 设置 Flex 布局
void UI_Object::set_flex_layout(lv_flex_flow_t flow, bool wrap, bool reserve, lv_flex_align_t main_align, lv_flex_align_t cross_align, lv_flex_align_t track)
{
    // 设置 Flex 布局的流动方向
    lv_obj_set_flex_flow(this_object, flow);

    // 设置 Flex 布局的对齐方式
    lv_obj_set_flex_align(this_object, main_align, cross_align, track);
}

// 构造函数
UI_Object::UI_Object()
{
    printf("UI_Object constructor\n");  // 打印构造函数日志
}

// 析构函数
UI_Object::~UI_Object()
{
    // 检查 LVGL 对象是否有效
    if (lv_obj_is_valid(this_object))
    {
        printf("UI_Object destructor: lv_obj_is_valid(this_object)\n");  // 打印析构函数日志
        lv_obj_del(this_object);  // 删除 LVGL 对象
    }

    printf("UI_Object destructor\n");  // 打印析构函数日志
}

// 设置 UI 元素的尺寸
void UI_Object::set_size(lv_coord_t width, lv_coord_t height)
{
    // 设置 LVGL 对象的高度和宽度
    lv_obj_set_height(this_object, height);
    lv_obj_set_width(this_object, width);

    // 更新内部记录的宽度和高度
    this->width = width;
    this->height = height;
}

// 设置 UI 元素的圆角半径
void UI_Object::set_radius(lv_coord_t radius)
{
    // 设置 LVGL 对象的圆角半径
    lv_obj_set_style_radius(this_object, radius, LV_PART_MAIN | LV_STATE_DEFAULT);
}

// 设置 UI 元素的背景颜色和不透明度
void UI_Object::set_bg_color(lv_color_t color, lv_opa_t value, lv_style_selector_t selector)
{
    // 设置 LVGL 对象的背景颜色
    lv_obj_set_style_bg_color(this_object, color, selector);

    // 设置 LVGL 对象的背景不透明度
    lv_obj_set_style_bg_opa(this_object, value, selector);
}

// 设置 UI 元素的位置
void UI_Object::set_pos(lv_coord_t x, lv_coord_t y)
{
    // 设置 LVGL 对象的位置
    lv_obj_set_pos(this_object, x, y);
}

// 设置 UI 元素的事件回调函数
void UI_Object::set_event_cb(lv_event_cb_t event_cb, lv_event_code_t filter, void* user_data)
{
    // 添加事件回调函数
    lv_obj_add_event_cb(this_object, event_cb, filter, user_data);
}

// 添加 UI 元素的标志
void UI_Object::add_flag(lv_obj_flag_t flag)
{
    // 添加标志（如可点击、可滚动等）
    lv_obj_add_flag(this_object, flag);
}

// 清除 UI 元素的标志
void UI_Object::clear_flag(lv_obj_flag_t flag)
{
    // 清除标志
    lv_obj_clear_flag(this_object, flag);
}

// 获取 UI 元素的宽度
lv_coord_t UI_Object::get_width()
{
    // 返回内部记录的宽度
    return this->width;
}

// 获取 UI 元素的高度
lv_coord_t UI_Object::get_height()
{
    // 返回内部记录的高度
    return this->height;
}

// 隐藏或显示 UI 元素
void UI_Object::hidden(bool hidden)
{
    if (hidden)
    {
        // 隐藏对象
        lv_obj_add_flag(this->this_object, LV_OBJ_FLAG_HIDDEN);
    }
    else
    {
        // 显示对象
        lv_obj_clear_flag(this->this_object, LV_OBJ_FLAG_HIDDEN);
    }
}